package com.anti.jdbc.core;

import com.anti.jdbc.support.DataBaseType;
import com.anti.jdbc.support.SpSupportBean;
import com.anti.jdbc.support.page.PageParam;
import com.anti.jdbc.support.page.PageResult;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;

import javax.sql.DataSource;
import java.util.List;
import java.util.Map;

/**
 * @Description sql操作基础类
 * @Author anTi
 * @Date 2021-3-12
 */
public interface SqlJdbcOperations {
    /**
     * 返回查询只有单一对象的结果，这个单一结果应该是简单的数据类型，
     * 如：Integer.class、Long.class、String.class等类型，不能直接封装成JavaBean对象。
     * 可以用于聚合函数的查询结果。
     * @param sql
     * @param cls
     * @param params
     * @param <R>
     * @return 单一对象结果的列
     */
    <R> R queryForObject(String sql, Class<R> cls, Object... params);

    <R> Object getValue(String sql, Class<R> cls, Object... params);

    /**
     * 查询单一实体对象
     * @param sql
     * @param cls
     * @param params
     * @param <R>
     * @return 返回实体对象
     */
    <R> R get(String sql, Class<R> cls, Object... params);

    Map<String, Object> get(String sql, Object... params);

    <R> R getFirst(String sql, Class<R> cls, Object... params);

    Map<String, Object> getFirst(String sql, Object... params);

    <R> List<R> query(String sql, Class<R> cls, Object... params);

    List<Map<String, Object>> query(String sql, Object... params);

    PageResult query(PageParam pageParam, String sql, Object... params);

    <R> PageResult query(PageParam pageParam, String sql, Class<R> cls, Object... params);

    int execSql(String sql, Object... params);

    void executeProcedure(SpSupportBean spSupportBean);

    <R> R executeFunction(String fun, Class<R> cls, Object... params);

}
